package solutions.ferpa.ztest.intf;

import br.com.telescope.adsrt.dom.DomId;
import br.com.telescope.adsrt.dom.DomText;
import br.com.telescope.adsrt.lib.*;
import br.com.telescope.adsrt.lib.Field;
import br.com.telescope.t2.AccessPolicy;
import br.com.telescope.t2.ServiceModel;
import br.com.telescope.t2.ServiceUrlManager;
import br.com.telescope.t2.config.WebRepositoryConfig;
import br.com.telescope.t2.exception.ApplicationRuntimeException;
import br.com.telescope.t2.feature.AbstractFeature;
import br.com.telescope.t2.feature.CustomFeature;
import java.io.IOException;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import solutions.ferpa.ztest.ent.*;

/**
 * Dashboard.
 * <p>
 * Interface que permite a construção de uma dashboard baseado em menu 
 * disponibilizado por parâmetro ou preferência de usuário 
 * (RTMENU.DASHBOARD.DEFAULT_DASHBOARD) que deve ter o valor de uma nome 
 * de menu EX: ENTRADA
 * <P>
 * 
 * <P>
 * ===Lista de parâmetros que podem ser usados nos itens de menu===
 * <P>
 * |Parametro|Descrição
 * <P>
 * |Z_COLUMNS|Define a quantidade de colunas que o bloco irá usar, 
 * lembrando que uma linha tem um total de 12 colunas. Quando não 
 * informado, assume 12.
 * <P>
 * |Z_ACTION|Define qual action da interface (determinada no item de 
 * menu) será apresentada no box
 * <P>
 * |Z_REFRESH|Define se o box irá se atualizar de tempo em tempo o valor 
 * desta propriedade é em milissegundos (1000 = 1 segundo,  1 minuto = 
 * 60000 milissegundos, 30 minutos = 60000 * 30 = 180000)
 * <P>
 * |Z_PADDING|Define um espaçamento interno do box com o conteúdo (em 
 * pixels)
 * <P>
 * |Z_COLLAPSE|Define que o box será apresentado fechado (necessitando 
 * clique do usuário para apresentar o conteúdo), caso o valor seja S
 * <P>
 * |Z_HEIGHT|Define a altura do box, caso o conteúdo seja maior que o 
 * box, irá criar um scroll verticalmente
 * <P>
 * |Z_RENDER_BUTTONS|Define se vai imprimir botões de ação
 * <P>
 * |Z_GRAPHIC|Define se o report será apresentado em forma de gráfico
 * <P>
 * |Z_GRAPHIC_TYPE|Define o formato do gráfico, suportanto os valores, 
 * pie, bar, line
 * <P>
 * |Z_ITEMS|Define quais colunas serão apresentadas ou retiradas das 
 * telas de lista. O valor deve conter os nome dos campos em maiúsculas, 
 * separados por vírgula. Para excluir colunas da tela de lista deve ser 
 * acrescentado o - (hífien) antes do nome do primeiro campo a ser 
 * excluído, como p.ex: -ESTADO,CIDADE para excluir as colunas de 
 * "estado" e "cidade" da tela de lista.
 * <P>
 * |Z_RENDER_QUERY_OPERATORS|Define se vai imprimir a lista de query 
 * operators
 * <P>
 * 
 * <P>
 * Ver também:
 * <P>
 * - [faq:7960]
 * <P>
 * 
 * <P>
 * Telescope origin: RTMENU.DASHBOARD
 * <P>
 * @author TELESCOPE - Build task T2 Web Interface Generator
 * <P>
 * @version 0.1
 */
public class Dashboard extends ServiceModel {
    
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    public static final String GLOBAL_NAME = "RTMENU.DASHBOARD";
    
    @Override
    public String globalName() {
        return GLOBAL_NAME;
    }
    
    {
        setTitle("Dashboard");
    }
    
    
    // Service parameters
    private DomText pDashboard;
    private DomId pItemMenuId;
    
    // Record items
    
    // Query items
    
    @Override
    public void initAttributes() {
        
    }
    
    @Override
    public void initParameters() {
        pDashboard = new DomText(ctx, "DASHBOARD", "Dashboard");
        pDashboard.setValue(ctx.getParameter("P_DASHBOARD"));
        pDashboard.setUnbound(true);
        pItemMenuId = new DomId(ctx, "ITEM_MENU_ID", "Item de menu");
        pItemMenuId.setValue(ctx.getParameter("P_ITEM_MENU_ID"));
        pItemMenuId.setUnbound(true);
    }
    
    @Override
    public List<Field> getParameters() {
        if (allParameters == null) {
            allParameters = new ArrayList<Field>();
            allParameters.add(pDashboard);
            allParameters.add(pItemMenuId);
        }
        return allParameters;
    }
    
    @Override
    public String getDefaultOrderBy() {
        return "";
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="DASH">
    public class FDash extends CustomFeature {
        
        @Override
        public void initForm() {
        }
        
        @Override
        public int getAccessPolicy() {
            return AccessPolicy.PUBLIC;
        }
        
        @Override
        public void preDisplay() {
            try {
                montaDashboard();
            } catch (AdsException ex) {
                throw new ApplicationRuntimeException(ex);
            }
        }
        
        {
            setFeatureName("DASH");
            setTitle("Dashboard");
            setPrimary(false);
        }
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="CARREGA_ITEM">
    public class FCarregaItem extends CustomFeature {
        
        @Override
        public void initForm() {
        }
        
        @Override
        public int getAccessPolicy() {
            return AccessPolicy.PUBLIC;
        }
        
        @Override
        public void execute() {
            try {
                carregaItem();
            } catch (AdsException ex) {
                throw new ApplicationRuntimeException(ex);
            }
        }
        
        {
            setFeatureName("CARREGA_ITEM");
            setPrimary(false);
        }
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="ATALHOS">
    public class FAtalhos extends CustomFeature {
        
        @Override
        public void initForm() {
        }
        
        @Override
        public int getAccessPolicy() {
            return AccessPolicy.PUBLIC;
        }
        
        @Override
        public void execute() {
            try {
                atalhos();
            } catch (AdsException ex) {
                throw new ApplicationRuntimeException(ex);
            }
        }
        
        {
            setFeatureName("ATALHOS");
            setTitle("Atalhos");
            setPrimary(false);
        }
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="initFeatures">
    
    @Override
    protected void initFeatures() {
        addFeature(new FDash());
        addFeature(new FCarregaItem());
        addFeature(new FAtalhos());
        super.initFeatures();
    }
    
    @Override
    public String getDefaultFeature() {
        return "DASH";
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="Getters and Setters">
    
    public String getParameterDashboard() {
        return pDashboard.getValue();
    }
    
    public void setParameterDashboard(String value) {
        pDashboard.setValue(value);
    }
    
    public Long getParameterItemMenuId() {
        return pItemMenuId.getValue();
    }
    
    public void setParameterItemMenuId(Long value) {
        pItemMenuId.setValue(value);
    }
    // </editor-fold>
    
    /**
     * null.
     * <p>
     * Carrega itens individuais da dashboard para chamadas via ajax através 
     * do parâmetro Z_REFRESH.
     */
    public void carregaItem() throws AdsException {
        // <user-code id="6649502" parentId="6649501" hashcode="4df49504" length="41">
        carregarItemMenu(pItemMenuId.getValue());
        // </user-code>
    }
    
    /**
     * Atalhos.
     * <p>
     * Bloco para uso nas dashboard, onde apresenta uma lista de atalhos 
     * importante para o usuário
     */
    public void atalhos() throws AdsException {
        // <user-code id="17828699" parentId="17828692" hashcode="1cd93266" length="828">
        // import br.com.telescope.t2.config.WebRepositoryConfig;
        
        String skin = WebRepositoryConfig.getInstance().getContextPath() + "/skins/eligo/";
        
        ctx.p("<div style=\"text-align:center;margin:20px 0\"><ul class=\"block-list\">");
        ctx.getSkinPath();
        ctx.p("<li><a href=\"CadProdutos\"><img src=\"" + skin + "images/produtos.png\" width=\"32\" height=\"32\" /><p>PRODUTOS</p></a></li>");
        ctx.p("<li><a href=\"CadPedidos06\"><img src=\"" + skin + "images/pedidos.png\" width=\"32\" height=\"32\" /><p>PEDIDOS</p></a></li>");
        ctx.p("<li><a href=\"CadDocEntrada\"><img src=\"" + skin + "images/nfe.png\" width=\"32\" height=\"32\" /><p>ENTRADA DE NOTA</p></a></li>");
        ctx.p("<li><a href=\"CadDoctes\"><img src=\"" + skin + "images/nfe.png\" width=\"32\" height=\"32\" /><p>EMISSÃO DE NOTA</p></a></li>");
        ctx.p("</ul></div>");
        // </user-code>
    }
    
    /**
     * Carregar item de menu.
     * <p>
     * Carrega item de menu
     */
    private void carregarItemMenu(Long itemMenuId) throws AdsException {
        // <user-code id="6649509" parentId="6649507" hashcode="-327812d" length="3621">
        EntItensMenus item = new EntItensMenus(ctx);
        
        try {
            item.find(itemMenuId);
        
            Properties p = new Properties();
            try {
                p.load(new StringReader(item.valueOfParametros()));
            } catch (IOException ex) {
            }
        
            String fullAction  = p.getProperty("Z_ACTION") == null ? "LIST" : p.getProperty("Z_ACTION");
            String interfaceName = item.findInterface().valueOfNome();
        
            String action = null;
            String funcao = null;
            
            if ("R".equals(item.findInterface().valueOfTipoRegistro())) {
                fullAction = "S".equals(p.getProperty("Z_GRAFICO")) ? "GRAFICO:SUBMIT" : "EXEC:SUBMIT";
                interfaceName = "REPORTS.PRO_REPORT2";
            }
        
            int index = fullAction.indexOf(":");
            if (index >= 0) {
                action = fullAction.substring(0, index);
                funcao = fullAction.substring(index + 1);
            } else {
                action = fullAction;
            }
            
            EntOperacoesSistemas operacao = null;
            if ("R".equals(item.findInterface().valueOfTipoRegistro())) {
                EntOperacoesSistemas op = item.findInterface().findAllOperacoesSistemasInterface();
                op.next();
                operacao = op;
            }
        
            String gName = null;
            if ("R".equals(item.findInterface().valueOfTipoRegistro())) {
                gName = operacao.valueOfOperacao();
            } else {
                gName = interfaceName + "." + action;
            }
        
            if (ctx.userHasAccessTo(gName)) {
        
                try {
                    ServiceModel service = ServiceUrlManager.newService(interfaceName);
                    ServletRuntime c = ctx.clone();
                    c.clearParameters();
        
                    c.setParameter("Z_RQ", "N");
                    
                    for (String key : p.stringPropertyNames()) {
                        c.setParameter(key, p.getProperty(key).replace("[USER]", ctx.getSession().getCurrentUser().getLoginName()));
                    }
        
        
                    if ("R".equals(item.findInterface().valueOfTipoRegistro())) {
                        c.setParameter("A_TIPO_SAIDA", "HTML");
                        c.setParameter("A_DESTINO_SAIDA", "BROWSER");
                        c.setParameter("A_ID", "" + operacao.valueOfId());
                        c.setParameter("Z_ACTION", "S".equals(p.getProperty("Z_GRAFICO")) ? "GRAFICO:SUBMIT" : "EXEC:SUBMIT");
                        service.setDetail(true);
                    }
                    
                    if ("S".equals(p.getProperty("Z_GRAFICO")) && p.getProperty("Z_GRAFICO_TIPO") != null) {
                        c.setParameter("A_TIPO_GRAFICO", p.getProperty("Z_GRAFICO_TIPO"));
                    }
                    
                    if ("N".equals(p.getProperty("Z_RENDER_BUTTONS", "S"))) {
                        c.setProperty("RENDER_BUTTONS", "N");
                    }
        
                    if ("N".equals(p.getProperty("Z_RENDER_QUERY_OPERATORS", "S"))) {
                        c.setProperty("RENDER_QUERY_OPERATORS", "N");
                    }
                    
                    c.setProperty("FIXED_TABLE_HEADER", "N");
                    c.setProperty("AUTOMATIC_FOCUS", "N");
                    service.instantiate(c);
        
                    AbstractFeature feature = service.getFeature(action);
        
                    feature.getForm().setSuffixElementId(itemMenuId.toString());
                    
                    service.setOrderable(false);
                    service.setCurrentFeature(feature);
                    service.setColumnsConfigEnabled(false);
                    feature.setAction(funcao);
                    
                    if (service.getJsServiceFile() != null) {
                        ctx.includeJavascriptFile(service.getJsServiceFile());
                    }
                    
                    feature.run();
        
                } catch (ClassNotFoundException ex) {
                }
            }
        } catch (RecordNotFoundException ex) {
        }
        // </user-code>
    }
    
    /**
     * Montar dashboard.
     */
    private void montaDashboard() throws AdsException {
        // <user-code id="6649117" parentId="6649115" hashcode="-66a0763e" length="5826">
        // import java.util.Properties;
        // import br.com.telescope.t2.ServiceModel;
        // import br.com.telescope.t2.ServiceUrlManager;
        // import java.io.StringReader;
        // import java.io.IOException;
        // import br.com.telescope.t2.feature.AbstractFeature;
        
        EntMenus menu = new EntMenus(ctx);
        
        try {
            menu.findByMenu(pDashboard.isNull() ? ctx.getUserPreference(globalName("DEFAULT_DASHBOARD"), "DASHBOARD_DEFAULT") : pDashboard.getValue());
            
            setTitle(menu.valueOfTitulo());
            
            EntItensMenus item = menu.findAllItensMenusMenu("and ativo = 'S' and interface_id is not null order by sequencia");
            
            int i = 0;
            int columns = 0;
            
            ctx.p("<script type=\"text/javascript\">");
            ctx.p("$(function () {");
            ctx.p("$(document).on('click', '.load-panel-content', function (e) {");
            ctx.p("var $this = $(this);var $content = $this.closest('.panel').find('.panel-body');");
            ctx.p("if ($content.is(':visible')) {");
            ctx.p("$this.addClass('icon-spin');");
            ctx.p("$.get(path.base + $this.data('url'), function (data) {");
            ctx.p("$content.html(data);");
            ctx.p("$this.removeClass('icon-spin');");
            ctx.p("});}");
            ctx.p("e.preventDefault();");
            ctx.p("});");
            ctx.p("});");
            ctx.p("</script>");
            
            while (item.next()) {
                Properties p = new Properties();
                try {
                    p.load(new StringReader(item.valueOfParametros()));
                } catch (IOException ex) {
                }
        
                String fullAction  = p.getProperty("Z_ACTION") == null ? "LIST" : p.getProperty("Z_ACTION");
                String interfaceName = item.findInterface().valueOfNome();
                
                String action = null;
                String funcao = null;
        
                if ("R".equals(item.findInterface().valueOfTipoRegistro())) {
                    fullAction = "EXEC:SUBMIT";
                    interfaceName = "REPORTS.PRO_REPORT2";
                }
        
                int index = fullAction.indexOf(":");
                if (index >= 0) {
                    action = fullAction.substring(0, index);
                    funcao = fullAction.substring(index + 1);
                } else {
                    action = fullAction;
                }
                
                EntOperacoesSistemas operacao = null;
                if ("R".equals(item.findInterface().valueOfTipoRegistro())) {
                    EntOperacoesSistemas op = item.findInterface().findAllOperacoesSistemasInterface();
                    op.next();
                    operacao = op;
                }
                
                String gName = null;
                if ("R".equals(item.findInterface().valueOfTipoRegistro())) {
                    gName = operacao.valueOfOperacao();
                } else {
                    gName = interfaceName + "." + action;
                }
        
                if (ctx.userHasAccessTo(gName)) {
                    int col = p.getProperty("Z_COLUMNS") == null ? 12 : Integer.parseInt(p.getProperty("Z_COLUMNS"));        
        
                    if (p.getProperty("Z_REFRESH") != null) { 
                        int time = Integer.parseInt(p.getProperty("Z_REFRESH"));
                        ctx.p("<script type=\"text/javascript\">");
                        ctx.p("$(function () { setInterval(function () { "
                                + "var content = $('#box-" + i + "');"
                                + "if (content.is(':visible')) {"
                                + "content.append('<div class=\"box-loading\"><img src=\"' + path.skin + '/images/loader.gif\" /></div>');"
                                + "$.get(path.base + '/app/Dashboard?Z_ACTION=CARREGA_ITEM&Z_TPL=0&P_ITEM_MENU_ID=" + item.valueOfId() + "', function (data) {"
                                + "content.html(data);"
                                + "});}"
                                + " }, " + time + ") });");
                        ctx.p("</script>");
                    }
        
                    if (columns == 0) {
                        ctx.p("<div style=\"" + (i > 0 ? "margin-top:10px" : "") + "\" class=\"row-fluid\">");
                    }
        
                    columns += col;
                    if (columns > 12) {
                        ctx.p("</div>");
                        ctx.p("<div style=\"" + (i > 0 ? "margin-top:10px" : "") + "\" class=\"row-fluid\">");
                    }
        
                    ctx.p("<div class=\"span" + col + "\">");
                    
                    if (p.getProperty("Z_BOX") == null || "s".equals(p.getProperty("Z_BOX").toLowerCase())) {
                        ctx.p("<div class=\"panel panel-primary\">"
                                + "<div class=\"panel-heading\">"
                                + "<h4>" + item.valueOfTitulo() + "</h4>"
                                + "<div class=\"options\">"
                                + "<a href=\"#\" data-url=\"/app/Dashboard?Z_ACTION=CARREGA_ITEM&Z_TPL=0&P_ITEM_MENU_ID=" + item.valueOfId() + "\" class=\"icon-refresh load-panel-content\"></a>"
                                + "<a href=\"#\" onclick=\"collapse(this, '#box-" + i + "');return false;\" class=\"icon-chevron-" + ("S".equals(p.getProperty("Z_COLLAPSE")) ? "down" : "up") + "\"></a></div></div>" 
                                + "<div class=\"panel-body\" style=\""
                                + "display:" + ("S".equals(p.getProperty("Z_COLLAPSE")) ? "none" : "block") 
                                + (p.getProperty("Z_HEIGHT") == null ? "" : ";height:" + p.getProperty("Z_HEIGHT") + "px;") 
                                + (p.getProperty("Z_PADDING") == null ? "" : ";padding:" + p.getProperty("Z_PADDING") + "px;") 
                                + "\" id=\"box-" + i +"\">");
                    }
                    
                    carregarItemMenu(item.valueOfId());
                    
                    if (p.getProperty("Z_BOX") == null || "s".equals(p.getProperty("Z_BOX").toLowerCase())) {
                        ctx.p("</div></div>");
                    }
                    
                    ctx.p("</div>");
        
                    if (columns >= 12) {
                        ctx.p("</div>");
                        columns = 0;
                    }
        
                    i++;
                }
        
            }
        } catch (RecordNotFoundException ex) {
        }
        // </user-code>
    }
}
